sendmessage函数 VB / 基础类 - CSDN社区 community.csdn.net社区焦点x
      CSDN版服设计大赛
      4月优秀版主考核结果
      SQL很有技术含量的问题
      学习.Net，就业情况如何
      出卖你性格的16个小动作
 
      CSDN首页空间新闻论坛Blog下载读书网摘搜索.NETJava视频接项目求职在线学习买书程序员通知

      【经验总结】不能实施并行处理的情况 浅谈并行编程中的任务分解模式 



搜索 收藏 打印 关闭 CSDN社区 >  VB >  基础类 
sendmessage函数楼主NaZiChong（那子虫）2002-04-16 07:35:11 在 VB / 基础类 提问
各位老大，能给我详细讲讲sendmessage这个函数的情况吗？   
  特别是她的各参数含义，以及各参数的值，还有就是msdn里面消息常数怎么查看，比如我想知道将窗口最大化应该发什么消息等等，着这些你们是怎么搞定的？？？？ 
问题点数：20、回复次数：4
Top
 
1 楼wwfang（晴天）回复于 2002-04-16 07:39:13 得分 0 你必须全部安装MSDN，然后搜索   
  其中：EM表示文本框消息，LB表示LISTBOX消息   
  还有很多，你得慢慢看喽。
Top
2 楼rivershan（阿门）回复于 2002-04-16 08:16:17 得分 
10在Windows编程中，向文本框控件、列表控件、按钮控件等是我们最常接触的控件了。但是在VB中这些控件有时无法实现我们的需要。在这时，我们只要简单的利用Windows 
  API函数就可以扩充这些控件的功能了。   
  顾名思义，SendMessage函数就是向窗口（这里的窗口指的是向按钮、列表框、编辑框等具有hWnd属性的控件）发送消息的函数，该函数的定义如下:   
  Declare   Function   SendMessage   Lib   "user32"   Alias   "SendMessageA"   _ 
  
  (ByVal   hwnd   As   Long,   _   
  ByVal   wMsg   As   Long,   _   
  ByVal   wParam   As   Long,   _   
  lParam   As   Any)   As   Long   
    
  其中hwnd指定接受消息的窗口，参数wMsg指定消息值，参数wParam   
lParam分别定义传递到窗口的附加参数。而在Windows系统的很多消息中，有一些不仅仅是提供一个窗口消息那么简单。它们可以控制窗口的动作和属性。下面我将分次向向大家介绍SendMessage函数在扩充基本控件功能方面的应用。
Top
3 楼NaZiChong（那子虫）回复于 2002-04-16 08:57:46 得分 0 继续讲呀！！！
Top
4 楼lihonggen0（李洪根，MS MVP，标准答案来了）回复于 2002-04-16 09:25:07 得分 10SendMessage,   
SendMessageBynum,   SendMessageByString     
    
  VB声明     
  Declare   Function   SendMessage&   Lib   "user32"   Alias   "SendMessageA"   
(ByVal   hwnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   
Long,   lParam   As   Any)   
  Declare   Function   SendMessageBynum&   Lib   "user32"   Alias   
"SendMessageA"   (ByVal   hwnd   As   Long,   ByVal   wMsg   As   Long,   ByVal  
 wParam   As   Long,   ByVal   lParam   As   Long)   
  Declare   Function   SendMessageByString&   Lib   "user32"   Alias   
"SendMessageA"   (ByVal   hwnd   As   Long,   ByVal   wMsg   As   Long,   ByVal  
 wParam   As   Long,   ByVal   lParam   As   String)     
  说明     
  调用一个窗口的窗口函数，将一条消息发给那个窗口。除非消息处理完毕，否则该函数不会返回。SendMessageBynum，   
SendMessageByString是该函数的“类型安全”声明形式     
  返回值     
  Long，由具体的消息决定     
  参数表     
  参数   类型及说明     
  hwnd   Long，要接收消息的那个窗口的句柄     
  wMsg   Long，消息的标识符     
  wParam   Long，具体取决于消息     
  lParam   Any，具体取决于消息     
    
  Top   
      
    
        
  功能强大的SendMessage函数   
  Windows   
API（应用程序接口）是Windows系列软件为程序开发人员提供的火力强大的“武器库”，在这个武器库中，有很多极具威力的武器，SendMessage就是其中之一，它的功能非常丰富，灵活使用这个函数，会给编程工作带来很多便利。本文以Visual 
  Basic为例，结合几个具体的例子介绍该函数的功能。     
  一、SendMeaasge函数简介     
        
顾名思义，SendMessage函数的功能是“发送消息”，即将一条消息发送到指定对象（操作系统、窗口或控件等）上，以产生特定的动作（如滚屏、修改对象外观等）。  
   
  SendMessage函数在VB中的函数说明如下：     
  Declare   Function   SendMessage   Lib   "user32"   Alias   "SendMessageA"   
(Byval   hwnd   As   Long,   Byval   wMsg   As   Long,Byval   wParam   As   
Long,lParam   As   Any)   As   Long     
  其中四个自变量的含义和说明如下：     
  
hWnd：对象的句柄。希望将消息传送给哪个对象，就把该对象的句柄作为实参传送，在VB中可以简单地用“对象.hWnd”获得某个对象的句柄，如Text1.hWnd和Form1.hWnd分别可以得到Text1和Form1的句柄。 
    
  wMsg：被发送的消息。根据具体需求和不同的对象，将不同的消息作为实参传送，以产生预期的动作。     
  
wParam、lParam：附加的消息信息。这两个是可选的参数，用来提供关于wMsg消息更多的信息，不同的wMsg可能使用这两个参数中的0、1或2个，如果不需要哪个附加参数，则将实参赋为NULL（在VB中赋为0）。 
    
  在简单了解了SendMessage函数的格式和功能后，让我们以几个例子来看看它的威力。     
  二、SendMessage函数使用实例     
  例1     多行TextBox中的快速处理功能在处理多行TextBox时我们经常会碰到以下几种情况：     
        希望了解多行TextBox中目前共有多少行文字。     
        想快速返回第N行的文字。     
        
对于上面的情况，如果用VB自身的语句或函数来实现的话，要写不短的代码，而且由于要采用顺序查找的办法来完成，因此代码的执行效率也很低。如果使用SendMessage函数则可以大大减少代码量，并大幅度的提高执行效率。 
    
        
用SendMessage函数完成上面两个任务的方法非常简单，每个任务只需简单地发送一条消息给多行TextBox即可，两个消息分别为：EM_GETLINECOUNT、EM_GETLINE，其它参数和返回值见附表。 
    
        下面用一个简单的实例演示这两个功能：     
  新建工程，在Form1上添加三个TextBox（名称分别为Text1、txtLineCount、TxtString，将Text1的Multi     
  Line属性置为True）、三个标签和一个命令按钮。为工程添加一个模块Moudle1，在其中写如下声明（其中     
  SendMessage函数的声明可以从VB的“API浏览器”中复制）：   消息常量名   消息值   wParam   lParam   返回值     
  EM_GETLINECOUNT   &HBA   未用   未用   行数     
  EM_GETLINE   &HC4   要找的行号   存结果的字节串   结果字节串的字节数     
    
  Declare   Function   SendMessage   Lib   "user32"   Alias   "SendMessageA"   
(ByVal   hwnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   
Long,lParam   As   Any)   As   Long     
  Public   Const   EM_GETLINECOUNT=&HBA     
  Public   Const   EM_GETLINE=&HC4     
  在Form1的代码模块中写如下代码：     
          Private   Sub   Command1_Click()     
          Dim   str(256)   As   Byte     
          str(1)=1   '最大允许存放256个字符     
          '获取总行数，结果显示在文本框txtLineCount中     
          txtlineCount=SendMessage(Text1.hwnd,EM_GETLINECOUNT,0,0)     
          '获取第3行的数据放在str中，转换为字符串后显示在文本框txtString中     
          SendMessage   Text1.hwnd,EM_GETLINE,2,str(0)     
          txtString=   StrConv(str,vbUnicode)     
  End   Sub     
        之后，按F5运行程序，在多行文本框中随便键入几行文字，然后按下[确定]按钮，说明程序正确统计出了总行数和第3行的文字。     
    
    
        
两点补充说明：在调用SendMessage获取第N行字符串时，lParam需要说明为字节数组，在调用完成后，再将字节数组转换为字符串；另外，调用前必须在lParam的前两个字节指明允许存放的最大长度，其中第一个字节为低位，第二个字节为高位，本例将高位（即str(1)）置1．说明最大允许存放256个字符。 
    
  例2     程序控制拉下或收起组合框的下拉列来     
        
一般情况下，为了拉下或收起组合框的下拉列表，需要用键盘或鼠标进行操作，而有时我们希望程序运行的某个时刻自动拉出下拉列表（比如在一些演示程序中），为了实现这个目的，我们也只有借助于SendMessage函数，方法是发一个CB_SHOWDROPDOWN(&H14F)消息给组合框。 
    
        
在发CB_SHOWDROPDOWN消息时，wParam参数决定了是拉下列表（=True时）还是收起列表（＝False时），lParam无用（设为0）。     
        为说明具体的使用方法，下面提供简单的程序片段。首先在代码模块中做如下声明：     
  Declare   Function   SendMessage   Lib   "user32"   Alias   "SendMessageA"   
(ByVal   hwnd   As   Long,ByVal   wMsg   As   Long，ByVal   wParam   As   
Long,lParam   As   Any)   As   Long     
  Const   CB_SHOWDROPDOWN=&H14F     
        当程序中某处需要拉下组合框Combol的列表时，写如下调用语句：     
  SendMessage   Combol.hwnd,CB_SHOWDROPDOWN,True,0     
        当需要收起组合框Combol的列表时，写如下语句：     
  SendMessage   Combol.hwnd,CB_SHOWDROPDOWNN,False,0     
  例3     在列表框中查找匹配的项目     
        
在Win95风格的帮助系统中一般都有一个“索引”页，索引页含有一个文本框和一个列表框，当用户在文本框中输入文字时，下拉列表会动态地显示与文本框中文字最匹配的项目，为用户提供了最大的方便。这种效果在应用程序的帮助系统中很容易实现（只要按照Win95帮助系统的正常制作过程制作就可以实现），如果想在应用程序的其它地方实现这种特性就需费一番心思了。 
    
        
而使用SendMessage函数实现上述特性则非常简单，甚至只需一条语句就足够了，那就是在文本框的Change事件中给列表框发一条LB_FINDSTRING(&H18F）消息，该消息告诉列表框在列表中查找匹配的项目。 
    
        
在发LB_FINDSTRING消息时，wParam参数代表从列表框的哪一个项目后面开始查找，一般情况下该参数可定为-1，表示从List1(0)即第一项开始向后循环查找，lParam则传进欲搜索的字符串（必须采用值传递）。 
    
        具体的代码和运行画面与后面的例4合并在一起演示。     
  例4     为ListBox添加水平滚动条     
        
在VB中，列表框控件仅提供垂直滚动条，没有设置水平滚动条的能力，当某些项目的文本宽度较长时，超出列表框宽度部分的文本就无法显示出来，因此，很有必要为ListBox添加一个水平滚动条来方便操作。 
    
        
为添加水平滚动条，只需发一条LB_SETHORIZONTALEXTENT(&H194)消息给列表框即可。发送消息时，wParam为滚动条的长度（以像素为单位，可通过计算得出准确的长度，也可随便给一个大于最大文本宽度的数字，如本例的250），lParam无用。下面是例3和例4合并在一起的代码和运行画面 
    
    
    
  Declare   Function   SendMessage   Lib   "user32"   Alias   
"SendMessageA"(ByVal   hwnd   As   Long,ByVal   wMsg   As   Long,ByVal   wParam  
 As   Long,lParam   As   Any)   As   Long     
  Public   Const   LB_FINDSTRING=&H18F     
  Public   Const   LB_SETHORIZONTALEXTENT=&H194     
  Private   Sub   Form_Load()     
          List1.AddItem   "软件"     
          List1.AddItem   "电脑游戏"     
          List1.AddItem   "电视机"     
          List1.AddItem   "电视台"     
          List1.AddItem   "电脑"     
          List1.AddItem   "电脑游戏软件"     
          '下一句为列表框添加水平滚动条     
          SendMessage   List1.hwnd,LB_SETHORIZONTALEXTENT,250,0     
  End   Sub     
  Private   Sub   Text1_Change()     
          '注意！当lParam传入的是字符串时，必须用ByVal传递     
          List1.ListIndex   ＝   SendMessage(List1.hwnd,LB_FINDSTRING,-1,ByVal   
Text1.Text)     
  End   Sub     
        
通过上面几个例子，想必您已经对SendMessage函数的强大功能有了初步的了解。事实上利用该函数我们还可以完成更多更好的任务，如控制文本框的自动滚屏、实现文字编辑过程中的Undo功能、操纵应用程序的窗体控制菜单等等，感兴趣的读者请参阅有关Windows 
  API的资料。     
        本文程序均用Visual   Basic   5.0企业版编写，在Pwin95环境下运行正常。
Top
相关问题如何使用sendmessage函数？ 
  sendmessage函数的问题 
  >>>>>>>简单问题SendMessage函数 
  SendMessage函数的问题 
  发消息的函数sendmessage如何用? 
  关于API函数SendMessage()的问题。 
  谁能给我讲讲SendMessage()函数。 
  请教API函数sendmessage问题 
  SendMessage函数的使用问题 
  求助关于SendMessage函数的问题 
关键词win95 
  函数 
  消息 
  控件 
  代码 
  vb 
  sendmessage 
  列表 
  文本框 
  参数 
得分解答快速导航帖主：NaZiChong 
  rivershan 
  lihonggen0 
相关链接Visual Basic类图书 
  Visual Basic类源码下载 
广告也精彩反馈请通过下述方式给我们反馈
  网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告 
  北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号 
  世纪乐知(北京)网络技术有限公司 提供技术支持 
  CSDN网站24小时值班电话：13552009689 
  Copyright © 2000-2009, CSDN.NET, All Rights Reserved 
   
 
